\input{tex/question04}

\subsection{标准答案}

\begin{minted}[mathescape,	
    linenos,
    numbersep=5pt,
    gobble=2,
    frame=lines,
    framesep=2mm,
    breaklines]{c++}
    template<typename T>
    class Component : public ComponentBase{
    public:
        static std::size_t component_type_id(){
            static std::size_t ID = component_type_count++;
            return ID;
        }
    };
\end{minted}

\subsection{解析}

我们需要实现 Component 的静态成员函数 component\_type\_id。这是从给出代码得知的：

\begin{minted}[mathescape,	
    linenos,
    numbersep=5pt,
    gobble=2,
    frame=lines,
    framesep=2mm,
    breaklines]{c++}
    class A : public Component<A>
    {};
    A::component_type_id()
\end{minted}

C++ 的模板不是具体类型，实例化之后才是（即函数模板不是函数，类模板不是类），类模板的静态成员或静态成员函数也不属于模板，而是属于实例化后的具体类型我们可以用一段代码来展示结论：

\begin{minted}[mathescape,	
    linenos,
    numbersep=5pt,
    gobble=2,
    frame=lines,
    framesep=2mm,
    breaklines]{c++}
    #include <iostream>

    template<typename T>
    struct Test{
        inline static int n = 10;
    };
    
    int main(){
        Test<int>::n = 1;
        std::cout << Test<void>::n << '\n';//10
        std::cout << Test<int>::n << '\n';//1
    }
\end{minted}

这段代码很轻易的就展示了静态数据成员属于模板实例化后的具体类型。 \mintinline{c++}{Test<void>::n} 和 \mintinline{c++}{Test<int>::n} 不是相同的 n
，并且 \mintinline{c++}{Test<void>} 和 \mintinline{c++}{Test<int>} 也不是一种类型（静态成员函数同理）。

所以我们的解法利用的是：不同的类型实例化 Component 类模板，也是不同的静态成员函数，静态成员函数里面的静态局部变量也都是唯一的，并且在第一次调用的时候才会初始化，后面就不会。

\clearpage